home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 25
/
AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso
/
PublicDomain
/
Anwendungen
/
LimitWhite
/
Source
/
LimitWhite.C
< prev
next >
Wrap
C/C++ Source or Header
|
2000-03-16
|
6KB
|
222 lines
/* ------------------------------------------------------------------------------------------------------------ */
/* *
* LimitWhite V1.0 Main Module
* */
/* ------------------------------------------------------------------------------------------------------------ */
#include "LimitWhite.h"
#include "Peripherel.C"
#include "globals.h"
#include "protos.h"
/* ------------------------------------------------------------------------------------------------------------ */
int main(int ac, char *av[])
{
CheckOSVer(); /* Check for OS3.0+ */
InstallPatches(); /* Patch the OS functions */
DoIDCMP(); /* Enter IDCMP loop */
RemovePatches(); /* Attempt to remove OS patches */
CleanUp(); /* Free system resources */
} /* if */
/* ------------------------------------------------------------------------------------------------------------ */
void wbmain(struct WBStartup *wbmsg)
{
/* Program started from WB. Pass control over to main() */
main(0, NULL);
} /* wbmain() */
/* ------------------------------------------------------------------------------------------------------------ */
void CheckOSVer()
{
struct Library *VersionBase;
/* Check OS version is at least V39 (OS 3.0) */
if (VersionBase = OpenLibrary("version.library", 0))
{
if (VersionBase->lib_Version < 39)
{
/* OS is 2.1 or lower */
DoEasyReq("LimitWhite V1.0 requires at least OS3.0");
CloseLibrary(VersionBase);
CleanUp();
} /* if */
CloseLibrary(VersionBase);
} /* if */
} /* CheckOSVer() */
/* ------------------------------------------------------------------------------------------------------------ */
void DoIDCMP()
{
CxMsg *msg;
ULONG sigs = 0, msgid, msgtype;
/* IDCMP loop */
/* First, create and activate the commodity */
SetupCx();
/* Enter IDCMP loop */
do
{
/* Wait for Cx and Ctrl-C signals */
sigs = Wait((1L << Cx_Broker_Mp->mp_SigBit) | SIGBREAKF_CTRL_C);
if (sigs & SIGBREAKF_CTRL_C)
{
AttemptExit();
} /* if */
else
{
/* Cx message */
while (msg = (CxMsg *)GetMsg(Cx_Broker_Mp))
{
/* Get message details and reply to it */
msgid = CxMsgID(msg);
msgtype = CxMsgType(msg);
ReplyMsg((struct Message *)msg);
/* Act upon the message */
switch(msgtype)
{
case CXM_COMMAND:
/* Commodities command */
switch(msgid)
{
case CXCMD_KILL:
/* Attempt to exit program */
AttemptExit();
break;
case CXCMD_UNIQUE:
/* User attempted to start another copy of LimitWhite */
DoEasyReq("LimitWhite is already running");
break;
default:
/* Show/Hide interface/Enable/Disable. Not relevant */
break;
} /* switch */
break;
default:
/* Show/Hide interface. Not relevant */
break;
} /* switch */
} /* while */
} /* else */
} while (Running == TRUE); /* do */
} /* DoIDCMP() */
/* ------------------------------------------------------------------------------------------------------------ */
void SetupCx()
{
struct NewBroker Cx_NewBroker = {
NB_VERSION,
"LimitWhite",
"LimitWhite V1.0 - ToneMaster, 2000",
"Reduces white colours to grey",
NBU_UNIQUE | NBU_NOTIFY,
0,
0,
NULL,
0
};
/* Set up commodities port */
if (!(Cx_Broker_Mp = CreateMsgPort()))
{
RemovePatches();
CleanUp();
} /* if */
Cx_NewBroker.nb_Port = Cx_Broker_Mp;
if (!(Cx_Broker = (CxObj *)CxBroker(&Cx_NewBroker, NULL)))
{
RemovePatches();
CleanUp();
} /* if */
ActivateCxObj(Cx_Broker, 1L);
} /* SetupCx() */
/* ------------------------------------------------------------------------------------------------------------ */
void AttemptExit()
{
/* Attempt to remove the patches */
if (RemovePatches())
{
Running = FALSE;
} /* if */
else
{
DoEasyReq("A program has patched LimitWhite's patches.\nLimitWhite cannot quit, but can be disabled");
} /* else */
} /* AttemptExit() */
/* ------------------------------------------------------------------------------------------------------------ */
void CleanUp()
{
CxMsg *msg;
/* Free system resources */
if (Cx_Broker)
{
DeleteCxObjAll(Cx_Broker);
} /* if */
while (msg = (CxMsg *)GetMsg(Cx_Broker_Mp))
{
ReplyMsg((struct Message *)msg);
} /* while */
DeleteMsgPort(Cx_Broker_Mp);
exit(0);
} /* CleanUp() */
/* ------------------------------------------------------------------------------------------------------------ */
/* End Of Text */